Quick-Sourcetext
D1:DE.LIB  
----------------
Length: $0000

Free  : $9999
----------------

************************************
* Copyright (c) 2015 Jim Wilkinson *
************************************

INTER VERTBLNK
LOCAL
 WORD
 [
 SP
 OP=130
 ]
BEGIN
 IPUSH
 ZPUSH
 SP=OP

 IF SCRLDELAY<250
  SCRLDELAY+
 ENDIF

 IF KEYDELAY<250
  KEYDELAY+
 ENDIF

 IF CONDELAY<250
  CONDELAY+
 ENDIF

 HPMCOL7=MCOL
 ADD(MCOL,16,MCOL)

 IF SETDLI=0 ;explorer
  SETDLI=255
  DLI(DLI0)
 ENDIF
 IF SETDLI=1 :editor
  SETDLI=255
  DLI(DLIE1)
 ENDIF
 IF SETDLI=2 ;selector
  SETDLI=255
  DLI(DLIS1)
 ENDIF
 IF SETDLI=5 ;title page
  SETDLI=255
  DLI(DLIT)
 ENDIF 
 IF SETDLI=20 ;dummy
  SETDLI=255
  DLI(DLI)
 ENDIF

 OP=SP
 IPULL
 ZPULL

ENDVBI

************************************

INTER DLI0 ;top status
BEGIN
 PUSH
 CHBAS=224   ;std charset
 PFCOL2=114
 DMA=62 ;normal
 DLI(DLI1)   ;make next DLI active
 PULL
ENDDLI

************************************

INTER DLI1 ;hex dump
BEGIN
 PUSH
 PFCOL2=144
 DLI(DLI1B)   ;make next DLI active
 PULL
ENDDLI

************************************

INTER DLI1B ;dec dump
BEGIN
 PUSH
 PFCOL2=148
 DLI(DLI1C)   ;make next DLI active
 PULL
ENDDLI

************************************

INTER DLI1C ;current byte line
BEGIN
 PUSH
 PFCOL2=64
 DLI(DLI2)   ;make next DLI active
 PULL
ENDDLI

************************************

INTER DLI2 ;ascii dump
BEGIN
 PUSH
 PFCOL2=112
 DMA=61 ;narrow
 DLI(DLI3)   ;make next DLI active
 PULL
ENDDLI

************************************

INTER DLI3 ;Antic 4 dark
BEGIN
 PUSH
 CHBAS=160
 DLI(DLI4)   ;make next DLI active
 PULL
ENDDLI

************************************

INTER DLI4 ;Antic 4 light
BEGIN
 PUSH
 DLI(DLI5)   ;make next DLI active
 PULL
ENDDLI

************************************

INTER DLI5 ;Antic 5 dark
BEGIN
 PUSH
 DLI(DLI6)   ;make next DLI active
 PULL
ENDDLI

************************************

INTER DLI6 ;Antic 5 light
BEGIN
 PUSH
 DLI(DLI7)   ;make next DLI active
 PULL
ENDDLI

************************************

INTER DLI7 ;Antic 6 dark
BEGIN
 PUSH
 DLI(DLI8)   ;make next DLI active
 PULL
ENDDLI

************************************

INTER DLI8 ;Antic 6 light
BEGIN
 PUSH
 DLI(DLI9)   ;make next DLI active
 PULL
ENDDLI

************************************

INTER DLI9 ;Antic 7 dark
BEGIN
 PUSH
 DLI(DLIA)   ;make next DLI active
 PULL
ENDDLI

************************************

INTER DLIA ;Antic 7 light
BEGIN
 PUSH
 DLI(DLIB)   ;make next DLI active
 PULL
ENDDLI

************************************

INTER DLIB ;bottom menu
BEGIN
 PUSH
* DMA=62 ;normal
* CHBAS=224
 PFCOL2=114
 DLI(DLI0)   ;make next DLI active
 PULL
ENDDLI

************************************
************************************

INTER DLI ;dummy
BEGIN
 PUSH
 PFCOL2=114
 DMA=62 ;normal
 DLI(DLI)
 PULL
ENDDLI

************************************
************************************

INTER DLIE1 ;editor title bar
BEGIN
 PUSH
 CHBAS=224
 PFCOL2=114
 DLI(DLIE2)   ;make next DLI active
 PULL
ENDDLI

************************************

INTER DLIE2 ;editor
BEGIN
 PUSH
 PFCOL2=144
 DLI(DLIE3)   ;make next DLI active
 PULL
ENDDLI

************************************

INTER DLIE3 ;display
BEGIN
 PUSH
 CHBAS=160 ;alt charset
 PFCOL2=114
 DLI(DLIE4)   ;make next DLI active
 PULL
ENDDLI

************************************

INTER DLIE4 ;editor command bar
BEGIN
 PUSH
 CHBAS=224
 PFCOL2=148
 DLI(DLIE1)   ;make next DLI active
 PULL
ENDDLI

************************************
************************************

INTER DLIS1 ;selector title bar
BEGIN
 PUSH
 PFCOL2=114
 DLI(DLIS2)   ;make next DLI active
 PULL
ENDDLI

************************************

INTER DLIS2 ;disk view
BEGIN
 PUSH
 PFCOL2=4
 DLI(DLIS3)   ;make next DLI active
 PULL
ENDDLI

************************************

INTER DLIS3 ;command bar
BEGIN
 PUSH
 PFCOL2=114
 DLI(DLIS4)   ;make next DLI active
 PULL
ENDDLI

************************************

INTER DLIS4 ;bottom bar
BEGIN
 PUSH
 PFCOL2=148
 DLI(DLIS1)   ;make next DLI active
 PULL
ENDDLI

************************************
************************************

INTER DLIT ;title page
BEGIN
 PUSH
 SYNC(2)
 PFCOL1=134
 SYNC(2)
 PFCOL1=138
 SYNC(2)
 PFCOL1=142
 SYNC(2)
 PFCOL1=142
 SYNC(2)
 PFCOL1=138
 SYNC(2)
 PFCOL1=134
 PFCOL2=0
 DLI(DLIT2)
 PULL
ENDDLI

************************************

INTER DLIT2
BEGIN
 PUSH
 PFCOL2=0
 DLI(DLIT)   ;make next DLI active
 PULL
ENDDLI

************************************

PROC READSTICKS
BEGIN

 *Read stick
 IF STICK0=7 ;right
  MX+
 ENDIF

 IF STICK0=11 ;left
  MX-
 ENDIF

 IF STICK0=14 ;up
  MY-
 ENDIF

 IF STICK0=13 ;down
  MY+
 ENDIF

 IF STICK0=6 ;NE
  MY-
  MX+
 ENDIF
 IF STICK0=10 ;NW
  MY-
  MX-
 ENDIF
 IF STICK0=5 ;SE
  MX+
  MY+
 ENDIF
 IF STICK0=9 ;SW
  MY+
  MX-
 ENDIF

ENDPROC

************************************

PROC READMOUSE
BEGIN
  MOUSE
  ADD(MX,46,XX)
  ADD(MY,28,YY)
  PLAYER(43,YY,16,12288) ;missile
  MISL3=XX
  XX+
  XX+
  MISL2=XX
  XX+
  XX+
  MISL1=XX
  XX+
  XX+
  MISL0=XX
ENDPROC

************************************

PROC MBOUND
IN
 BYTE
 [
  XB,YB
 ]
OUT
 BYTE
 [
  BOX
 ]
BEGIN

 BOX=0 ;default - not found

 IF MODE=0 ;explorer hotspots

  *ascii box
  IF XB>=68
   IF YB>=82
    IF XB<=196
     IF YB<=114
      BOX=1
     ENDIF
    ENDIF
   ENDIF
  ENDIF

  *antic LEFT TOP
  IF XB>=68
   IF YB>=115
    IF XB<=132
     IF YB<=132
      BOX=2
     ENDIF
    ENDIF
   ENDIF
  ENDIF

  *antic LEFT BOT
  IF XB>=68
   IF YB>=134
    IF XB<=132
     IF YB<=166
      BOX=3
     ENDIF
    ENDIF
   ENDIF
  ENDIF

  *antic RIGHT TOP
  IF XB>=133
   IF YB>=115
    IF XB<=196
     IF YB<=132
      BOX=4
     ENDIF
    ENDIF
   ENDIF
  ENDIF

  *antic RIGHT BOT
  IF XB>=133
   IF YB>=134
    IF XB<=196
     IF YB<=166
      BOX=5
     ENDIF
    ENDIF
   ENDIF
  ENDIF
 
  *GR.1
  IF XB>=69
   IF YB>=168
    IF XB<=197
     IF YB<=184
      BOX=6
     ENDIF
    ENDIF
   ENDIF
  ENDIF

  *GR.2
  IF XB>=69
   IF YB>=186
    IF XB<=197
     IF YB<=218
      BOX=7
     ENDIF
    ENDIF
   ENDIF
  ENDIF

  *scrolling
  *hex scroll left
  IF XB>=53
   IF YB>=28
    IF XB<=131
     IF YB<=54
      BOX=20
     ENDIF
    ENDIF
   ENDIF
  ENDIF

  *hex scroll right
  IF XB>=133
   IF YB>=28
    IF XB<=211
     IF YB<=54
      BOX=21
     ENDIF
     ENDIF
   ENDIF
  ENDIF

  *dec scroll left
  IF XB>=53
   IF YB>=57
    IF XB<=131
     IF YB<=72
      BOX=30
     ENDIF
    ENDIF
   ENDIF
  ENDIF

  *dec scroll right
  IF XB>=133
   IF YB>=57
    IF XB<=211
     IF YB<=72
      BOX=31
     ENDIF
    ENDIF
   ENDIF
  ENDIF

 ENDIF

 IF MODE=1 ;editor hotspots

  *antic 4
  IF XB>=53
   IF YB>=153
    IF XB<=182
     IF YB<=160
      BOX=101
     ENDIF
    ENDIF
   ENDIF
  ENDIF

*  *antic 5
*  IF XB>=53
*   IF YB>=161
*    IF XB<=182
*     IF YB<=178
*      BOX=102
*     ENDIF
*    ENDIF
*   ENDIF
*  ENDIF

*  *antic 6
*  IF XB>=53
*   IF YB>=179
*    IF XB<=182
*     IF YB<=194
*      BOX=103
*     ENDIF
*    ENDIF
*   ENDIF
*  ENDIF

*  *antic 2
*  IF XB>=53
*   IF YB>=195
*    IF XB<=182
*     IF YB<=202
*      BOX=104
*     ENDIF
*    ENDIF
*   ENDIF
*  ENDIF

 ENDIF

ENDPROC

************************************

PROC MOUSECHK
LOCAL
 BYTE
 [
  H,V,Q,FIRE
  X,Y,BOX,B,CARRY,A
 ]
 WORD
 [
  WW,HH,BC,ES
 ]
BEGIN

  *check both tiggers
 FIRE=1
 IF STRIG0=0 ;trigger
  GRACTL=3
  FIRE=0
 ENDIF
 IF STRIG1=0
  FIRE=0
 ENDIF

  IF MODE=0 ;explorer hot spots
   IF FIRE=0

   .MBOUND(XX,YY,BOX) ;chk bounds

   IF BOX=1 ;ascii box
    SUB(XX,69,XX)
    SUB(YY,83,YY)
    *convert to char spacing
    DIV(XX,4,H)
    DIV(YY,8,V)
    *find selected char
    MULT(V,32,X)
    ADD(X,H,X)
    *add highlighting
    .HIGHLIGHT(X,2)
   ENDIF

   IF BOX>=2 ;any antic
   IF BOX<=5
    IF BOX=2 ;antic LEFT TOP
     SUB(XX,69,XX)
     SUB(YY,116,YY)
     DIV(YY,8,V)
    ENDIF

    IF BOX=3 ;antic LEFT BOT
     SUB(XX,69,XX)
     SUB(YY,135,YY)
     DIV(YY,16,V)
    ENDIF

    IF BOX=4 ;antic RIGHT TOP
     SUB(XX,133,XX)
     SUB(YY,116,YY)
     DIV(YY,8,V)
    ENDIF

    IF BOX=5 ;antic RIGHT BOT
     SUB(XX,133,XX)
     SUB(YY,135,YY)
     DIV(YY,16,V)
    ENDIF

    *convert to char spacing
    DIV(XX,8,H)
    *find selected char
    MULT(V,8,X)
    ADD(X,H,X)
    *add highlighting
    .HIGHLIGHT(X,16)
   ENDIF
   ENDIF

   IF BOX=6 ;GR.1
    SUB(XX,69,XX)
    SUB(YY,168,YY)
    *convert to char spacing
    DIV(XX,16,H)
    DIV(YY,8,V)
    *find selected char
    MULT(V,8,X)
    ADD(X,H,X)
    *add highlighting
    .HIGHLIGHT(X,16)   
   ENDIF

   IF BOX=7 ;GR.2
    SUB(XX,69,XX)
    SUB(YY,186,YY)
    *convert to char spacing
    DIV(XX,16,H)
    DIV(YY,16,V)
    *find selected char
    MULT(V,8,X)
    ADD(X,H,X)
    *add highlighting
    .HIGHLIGHT(X,16)   
   ENDIF

  ENDIF ;trigger

  *scrolling
  IF SCRLDELAY>=4
   SCRLDELAY=0

   *hex scrolling
   A=0
   PEEK(1544,X)
   IF BOX=21 ;hex right
    IF HEXSP<24
     X+
     HEXSP+
     A+
    ENDIF
   ENDIF
   IF BOX=20 ;hex left
    IF HEXSP>0
     X-
     HEXSP-
     A+
    ENDIF
   ENDIF
   IF A=1
    POKE(1544,X)
    SUB(X,64,X)
    POKE(1547,X)
    SUB(X,64,X)
    POKE(1550,X)
    SUB(X,64,X)
    POKE(1553,X)
   ENDIF

   *dec scrolling
   A=0
   PEEK(1557,X)
   IF BOX=31 ;dec right
    IF DECSP<216
     X+
     DECSP+
     A=1
    ENDIF
   ENDIF
   IF BOX=30 ;dec left
    IF DECSP>0
     X-
     DECSP-
     A=1
    ENDIF
   ENDIF
   IF A=1
    POKE(1557,X)
    POKE(1560,X)
   ENDIF   

  ENDIF
  BOX=0
 ENDIF

 IF MODE=2 ;selector
  IF FIRE=0
   .BUTCHECK(15839,3,X) ;map (slow)
   IF X=1 ;map sectors
    WW=15104
    HH=0
    BC=0
    ES=0
    CARRY=0
    REPEAT
     .READDATA(HH)
     *analyze
     V=0
     B=0
     MM=7168
     REPEAT
      PEEK(MM,V)
      IF V<>0
       B+
      ENDIF
      ADD(MM,1,MM)
     UNTIL MM=7296

     *write results to screen
     *IF B<=128
     * A=84 ;full
     *ENDIF
     *IF B<=96
     * A=203 ;3/4
     *ENDIF
     *IF B<=64
     * A=85 ;1/2
     *ENDIF
     *IF B<=32
     * A=79 ;1/4
     *ENDIF
     
     IF V=0
      A=0 ;empty
      ADD(ES,1,ES)
     ELSE
      A=84
     ENDIF

     *highlight dir table
     IF HH>358
      IF HH<369
       A=36
      ENDIF
     ENDIF
     POKE(WW,A)

     ADD(BC,V,BC) ;total bytes
     IF BC>50000
      CARRY=5
      SUB(BC,50000,BC)
     ENDIF
     ADD(WW,1,WW)
     ADD(HH,1,HH)
    UNTIL HH=720
    .CSTR2(ES,16081,3,0) ;empty secs
    .CSTR2(BC,16069,5,0) ;total bytes
    IF CARRY>0 ;handle >word #
     PEEK(16069,X)
     ADD(X,5,X)
     POKE(16069,X)
    ENDIF
   ENDIF

   .BUTCHECK(15944,5,X) ;quick (map)
   IF X=1 ;quick map sectors
    WW=15104
    ES=0
    BC=0
    CARRY=0
    .READDATA(360)
    MM=7178
    REPEAT
     PEEK(MM,V)
     B=255
     REPEAT
      AND(V,B,X)
      *write results to screen
      IF X=B
       A=0
       ADD(ES,1,ES)
      ELSE
       A=84
       ADD(BC,125,BC)
       IF BC>50000
        CARRY=5
        SUB(BC,50000,BC)
       ENDIF
      ENDIF
      *highlight dir table
      IF MM=7223
       A=36
      ENDIF
      POKE(WW,A)       
      ADD(WW,1,WW) :next screen byte
      LSRB(B) ;shift right
     UNTIL B=0
     ADD(MM,1,MM) ;next map byte
    UNTIL MM=7268
    POKE(15463,36) ;vtoc
    .CSTR2(ES,16081,3,0) ;empty secs
    .CSTR2(BC,16069,5,0) ;total bytes
    IF CARRY>0 ;handle >word #
     PEEK(16069,X)
     ADD(X,5,X)
     POKE(16069,X)
    ENDIF
   ENDIF

   .BUTCHECK(15957,5,X) ;files
   IF X=1 ;file
    CLR(162,8) ;clear space
    WW=41472
    HH=361
    MAXFILES=0
    *copy 4 dir sectors to buffer
    REPEAT
     .READDATA(HH)
     MM=7168
     Y=0
     REPEAT
      PEEK(MM,A) ;attrib byte
      ADD(MM,1,MM)
      IF A>=128
       A=0 ;set to skip
      ENDIF
      IF A=0 ;empty filespace
       ADD(MM,15,MM) ;skip filespace
       IF MM>=7295
        Y=8
       ENDIF
      ELSE
       *read file info
       DPEEK(MM,BC) ;file len
       ADD(MM,2,MM)
       DPEEK(MM,ES) ;start sec
       ADD(MM,2,MM)
       *write file info
       DPOKE(WW,BC)
       ADD(WW,2,WW)
       DPOKE(WW,ES)
       ADD(WW,2,WW)
       X=0
       REPEAT ;read/write filename
        PEEK(MM,B)
        POKE(WW,B)
        ADD(MM,1,MM)
        ADD(WW,1,WW)
        X+
       UNTIL X=11 ;one filename
       Y+
       MAXFILES+
      ENDIF
     UNTIL Y=8 ;files per sec

     ADD(HH,1,HH) ;next sector
    UNTIL HH=368
   
    *display first 6
    FILELIST=1
    .DRAWFILES()
   ENDIF

   *explore button
   .BUTCHECK(15824,7,X)
   IF X=1
     *draw explorer
    .SCREEN(0)
    .DRAWSCRN(1)
   ENDIF

   *edit button
   .BUTCHECK(15833,4,X)
   IF X=1
    *draw editor
    .SCREEN(1)
    .DRAWSCRN(1)
   ENDIF

   *find button
   .BUTCHECK(15951,4,X)
   IF X=1
    .INBOX(16088,16,16,A)
    IF A=1
     *count & convert chars
     WW=16088
     A=0 ;byte count
     REPEAT
      PEEK(WW,B)
      IF B>0 ;not end of digits
       *convert hex to ascii
       .CNV2NUM(WW,16,X) ;convert
       ADD(WW,1,WW)
       ST(A)=X ;store value
       A+
      ENDIF
      ADD(WW,1,WW)
     UNTIL WW>16104
     A- ;adjust counter
     HH=1 ;start sector
     REPEAT
      *get sector
      .READDATA(HH)
      B=0
      DD=7168
      REPEAT ;scan through all bytes
       PEEK(DD,B)
       IF B=ST(X)
        X+
       ELSE
        X=0 ;reset
       ENDIF
       *all bytes match
       IF X=A
        ADD(15104,HH,MM)
        POKE(MM,38) ;write F
        DD=7295 ;exit search
       ENDIF
       ADD(DD,1,DD)
      UNTIL DD=7296
      ADD(HH,1,HH)
     UNTIL HH=721
    ENDIF
    *clear input box
    DD=16088
    REPEAT
     POKE(DD,0)
     ADD(DD,1,DD)
    UNTIL DD=16104
   ENDIF

   IF X=0 ;non button clicked
    *find mouse x,y
    *convert to char spacing
    ADD(MY,4,YY)
    DIV(MX,4,X)
    DIV(YY,8,Y)
    *find selected char
    MULT(Y,40,DD)
    ADD(DD,X,DD)
    ADD(DD,1,DD) ;comp zero index
    *update stats
    IF DD<=720 :sector clicked
     CURSEC=DD
     .CSTR3(CURSEC,8119)
     .READDATA(CURSEC)
     PEEK(7295,V)
     .CSTR3(V,8133)
    ELSE
     *file selector scrolling
     IF X>24
      IF Y<=20 ;scroll up
       IF FILELIST>1
        FILELIST-
       ENDIF
      ENDIF
      IF Y>=21 ;scroll down
       ADD(FILELIST,6,B)
       IF B<=MAXFILES
        FILELIST+
       ENDIF
      ENDIF
      .DRAWFILES()
     ENDIF

     IF X=23 ;file to disk plot
      IF MAXFILES>0
       *unhighlight map
       HH=15104
       REPEAT
        PEEK(HH,B)
        IF B>127
         SUB(B,128,B)
         POKE(HH,B)
        ENDIF
        ADD(HH,1,HH)
       UNTIL HH=15824

       *highlight file space
       SUB(Y,19,B)
       ADD(FILELIST,B,B)
       MULT(B,15,DD) ;get src loc
       ADD(DD,41472,MM)
       DPEEK(MM,BC) ;find len of file
       ADD(MM,2,MM)
       DPEEK(MM,ES) ;start of file
       ADD(15103,ES,DD) ;start sector
       ADD(DD,BC,MM)    ;end sector
       CURSEC=ES

       *get first sector info
       *.READDATA(CURSEC)
       *PEEK(7295,V)
       .CSTR3(0,8133)

       *draw
       REPEAT
        PEEK(DD,B)
        IF B<>36
         ADD(B,128,B)
         POKE(DD,B)
        ELSE
         ADD(MM,1,MM) ;skip over FAT
        ENDIF
        ADD(DD,1,DD)
       UNTIL DD=MM

      ENDIF
     ENDIF
    ENDIF
   ENDIF
   .CSTR3(CURSEC,8119) ;top mid sec#
  ENDIF
 ENDIF

 IF MODE=1 ;editor
  IF FIRE=0

   .MBOUND(XX,YY,BOX) ;chk bounds
   IF BOX=101 ;Antic 4
    SUB(YY,153,X)       ;swap axis
    SUB(XX,53,Y)
    DIV(Y,8,Y)
    .EDHILIGHT(X,Y)
   ENDIF
*   IF BOX=104 ;Antic 2
*    SUB(YY,195,X)       ;swap axis
*    SUB(XX,53,Y)
*    DIV(Y,8,Y)
*    .EDHILIGHT(X,Y)
*   ENDIF

   *find mouse x,y
   ADD(MY,4,YY)
   DIV(MX,4,X)
   DIV(YY,8,Y)
   *find selected char
   MULT(Y,40,DD)
   ADD(DD,X,DD)
   ADD(14080,DD,DD)
   PEEK(DD,B) :get curr char

   IF EDITMODE=3 ;HEX
    IF B<>0 ;space not selected
     *adjust for columns
     ADD(DD,1,MM) ;look at next pos
     PEEK(MM,B)
     IF B=0
      SUB(DD,1,DD) ;adj back if req
     ENDIF
     REPEAT
      .INBOX(DD,2,16,A)
      .CNV2NUM(DD,16,Q)
      ADD(DD,3,DD)
      DIV(DD,40,MM)
      MULT(MM,40,MM)

      .DRAWEDIT(MM,DD,Q)

      ADD(MM,25,MM)
      *adjust for end of line
      IF DD=MM
       ADD(DD,16,DD) ;next line
      ENDIF
      IF DD>14705 ;end of sector/scrn
       A=0
      ENDIF
     UNTIL A=0
    ENDIF
   ENDIF

   IF EDITMODE=4 ;DEC
    IF Y<16
     DIV(X,4,A)
     MULT(A,4,A)
     MULT(Y,40,DD)
     ADD(DD,A,DD)
     ADD(14080,DD,DD)
     REPEAT
      .INBOX(DD,3,10,A)
      .CNV2NUM(DD,10,Q)
      ADD(DD,4,DD)
      DIV(DD,40,MM)
      MULT(MM,40,MM)
      ADD(MM,32,MM)
      .DRAWEDIT(MM,DD,Q)
      *adjust for end of line
      IF DD=MM
       ADD(DD,8,DD) ;next line
      ENDIF
      IF DD>14711 ;end of sector
       A=0
      ENDIF
     UNTIL A=0
    ENDIF
   ENDIF

   IF Y>=23 ;menu bar
    WW=1792 ;write buffer
    .BUTCHECK(14960,8,X) ;save
    IF X=1
     FMOVE(40968,1792,128)
     *write to disk
     ADD(SRANGE,ERANGE,A)
     IF A=0 ;check for range
      .WRITEDATA(CURSEC) ;single sector
     ELSE
      WW=SRANGE
      REPEAT
       .WRITEDATA(WW)
       ADD(WW,1,WW)
      UNTIL WW>ERANGE
     ENDIF
    ENDIF

    .BUTCHECK(14966,4,X) ;fill
    IF X=1
     IF EDITMODE=3
      .CNV2NUM(14081,16,X) ;convert
     ELSE
      .CNV2NUM(14080,10,X) ;convert
     ENDIF
     Y=0
     DD=40968
     REPEAT
      POKE(DD,X)
      ADD(DD,1,DD)
      Y+
     UNTIL Y=128
     .DRAWSCRN(0)  
    ENDIF

    .BUTCHECK(14972,5,X) ;range
    IF X=1
     POKE(14910,13) ;"-"
     .INBOX(14907,3,10,A)
     IF A=1
      .INBOX(14911,3,10,A)
     ENDIF
     IF A=1
      *range start
      .CNV2NUM(14907,10,SRANGE)
      *range end
      .CNV2NUM(14911,10,ERANGE)
      *basic bounds check
      IF SRANGE=0
       SRANGE=1
      ENDIF
      IF ERANGE>720
       ERANGE=720
      ENDIF
     ENDIF
    ENDIF

    .BUTCHECK(14987,5,X) ;print/export
    IF X=1
     *check for range set
     ADD(SRANGE,ERANGE,A)
     IF A=0 ;yes range
      .READDATA(CURSEC)
      .PRINT(7168)
     ELSE
      WW=SRANGE
      REPEAT
       .READDATA(CURSEC)
       .PRINT(7168)
       ADD(WW,1,WW)
      UNTIL WW>ERANGE
     ENDIF
    ENDIF

   ENDIF
   .CSTR3(CURSEC,8039) ;top mid sec#
  ENDIF
 ENDIF

ENDPROC

************************************

PROC PRINT
IN
 WORD
 [
  MLOC
 ]
LOCAL
 BYTE
 [
  B,X,Y
 ]
BEGIN

 Y=0
 REPEAT
  X=0
  REPEAT
   PEEK(MLOC,B)
   LPT(B);
   IF X<7
    LPT(",");
   ENDIF
   ADD(MLOC,1,MLOC)
   X+
  UNTIL X=8
  LPT("")
  Y+
 UNTIL Y=16

ENDPROC

************************************

PROC EDHILIGHT
IN
 BYTE
 [
  X,Y
 ]
LOCAL
 BYTE
 [
  A,B,C
 ]
BEGIN

 SUB(EDITMODE,1,C)

 *unhighlight
 IF LEDITHL>0
  B=0
  DD=LEDITHL
  SUB(DD,1,DD)
  REPEAT
   PEEK(DD,A)
   IF A>=128
    SUB(A,128,A)
   ENDIF
   POKE(DD,A)
   ADD(DD,1,DD) ;next byte
   B+
  UNTIL B>4
 ENDIF

 *highlight
 ADD(X,Y,A)
 IF A>0
  MULT(Y,40,DD)
  MULT(X,EDITMODE,X)
  ADD(14080,DD,DD)
  IF EDITMODE=3
   X+
  ENDIF
  ADD(DD,X,DD)
  B=0
  LEDITHL=DD
  REPEAT
   PEEK(DD,A)
   IF A<128
    ADD(A,128,A)
   ENDIF
   POKE(DD,A)
   ADD(DD,1,DD) ;next byte
   B+
  UNTIL B=C
 ENDIF

ENDPROC

************************************

PROC DRAWEDIT
IN
 WORD
 [
  EOL,CUR
 ]
 BYTE
 [
  VAL
 ]
LOCAL
 BYTE
 [
  DE1,DY,DX
 ]
 WORD
 [
  DW1,DW2
 ]
BEGIN

 *calc offset
 SUB(CUR,14080,DW1)

 *div offset by 40 = Y
 DIV(DW1,40,DY)

 *offset - (mult Y * 40) = X
 MULT(DY,40,DW2)

 SUB(DW1,DW2,DX)
 DIV(DX,EDITMODE,DX)

 *write ascii block - (Y*40)+32+X
 ADD(DW2,31,DW2)
 ADD(DX,DW2,DW2)
 ADD(DW2,14080,DW2)
 .EXT2INT(VAL,DE1)
 POKE(DW2,DE1)

 *(Y * 8) + X = dest 40968 write
 MULT(DY,8,DW1)
 ADD(DW1,DX,DW1)
 ADD(40967,DW1,DW1)
 POKE(DW1,VAL)

 *PMG
 .EFILL()

ENDPROC

************************************

PROC CNV2NUM
IN
 WORD
 [
  IW
 ]
 BYTE
 [
  TYPE
 ]
OUT
 BYTE
 [
  OB
 ]
LOCAL
 BYTE
 [
  BX,BY,BA
 ]
BEGIN

 *byte 1
 PEEK(IW,BX)
 IF BX>32 ;A+
  SUB(BX,23,BX)
 ELSE ;0+
  SUB(BX,16,BX)
 ENDIF

 *byte 2
 ADD(IW,1,IW)
 PEEK(IW,BY)
 IF BY>32 ;A+
  SUB(BY,23,BY)
 ELSE ;0+
  SUB(BY,16,BY)
 ENDIF

 IF TYPE=10
  *byte 3
  ADD(IW,1,IW)
  PEEK(IW,BA)
  IF BA>32 ;A+
   SUB(BA,23,BA)
  ELSE ;0+
   SUB(BA,16,BA)
  ENDIF
 ENDIF

 IF TYPE=16
  MULT(BX,16,BX)
  ADD(BX,BY,OB) ;return
 ELSE
  MULT(BX,100,BX)
  MULT(BY,10,BY)
  ADD(BY,BA,BY)
  ADD(BX,BY,OB) ;return
 ENDIF

ENDPROC

************************************

PROC DRAWFILES
LOCAL
 BYTE
 [
  Y,B,X
 ]
 WORD
 [
  WW
 ]
BEGIN

 MULT(FILELIST,15,DD) ;get src
 SUB(DD,15,DD) :zero index
 ADD(DD,41472,MM) ;1st DIR sector

 DD=15847 :screen area
 Y=0
 REPEAT
  *check for valid file
   *write file info
   POKE(DD,84)
   ADD(DD,2,DD)
   DPEEK(MM,WW)
   .CSTR2(WW,DD,3,0) ;file size
   ADD(MM,4,MM)
   ADD(DD,4,DD)

   X=0
   REPEAT
    PEEK(MM,B) ;write file name
    SUB(B,32,B)
    POKE(DD,B)
    ADD(DD,1,DD)
    ADD(MM,1,MM)
    X+
   UNTIL X=11
   ADD(DD,23,DD) ;next screen line
   Y+
 UNTIL Y=6

ENDPROC

************************************

PROC HIGHLIGHT
IN
 BYTE
 [
  CHAR
  LEN
 ]
LOCAL
 BYTE
 [
  S,X
 ]
 WORD
 [
  WW
 ]
BEGIN

 IF CHAR<16 
  *update currbyte
  ADD(40968,CHAR,DD)
  PEEK(DD,CURRBYTE)
  .CFILL()

  *hex highlighting
  *unhighlight
  IF LHSTART<>LHEND
   MM=8192 ;hex dump start
   *calc start and end points
   REPEAT
    PEEK(LHSTART,X)
    IF X>=128
     SUB(X,128,X)
    ENDIF
    POKE(LHSTART,X)
    ADD(LHSTART,1,LHSTART)
   UNTIL LHSTART=LHEND
  ENDIF

  MM=8192 ;hex dump start
  *calc start and end points
  MULT(CHAR,LEN,S)
  ADD(MM,S,MM)
  ADD(MM,LEN,DD)
  *save 
  LHSTART=MM
  LHEND=DD
  *highlight
  REPEAT
   PEEK(MM,X)
   ADD(X,128,X)
   POKE(MM,X)
   ADD(MM,1,MM)
  UNTIL MM=DD

  *dec highlighting
  *unhighlight
  IF LHSTARTD<>LHENDD
   MM=12800 ;dec dump start
   *calc start and end points
   REPEAT
    PEEK(LHSTARTD,X)
    IF X>=128
     SUB(X,128,X)
    ENDIF
    POKE(LHSTARTD,X)
    ADD(LHSTARTD,1,LHSTARTD)
   UNTIL LHSTARTD=LHENDD
  ENDIF

  MM=12800 ;dec dump start
  MULT(LEN,2,LEN)
  *calc start and end points
  MULT(CHAR,LEN,WW)
  ADD(MM,WW,MM)  ;start
  ADD(MM,LEN,DD) ;end
 
  *12800-13311

  *save
  LHSTARTD=MM
  LHENDD=DD
   SUB(DD,1,DD)
  *highlight
  REPEAT
   PEEK(MM,X)
   ADD(X,128,X)
   POKE(MM,X)
   ADD(MM,1,MM)
  UNTIL MM=DD

 ENDIF

ENDPROC

************************************

PROC KEYCHECK
LOCAL
 BYTE
 [
 B,X
 ]
BEGIN

 IF KEYDELAY>=1
  KEYDELAY=0

  B=KEYBD

  IF B>63 ;convert for up&lwr case
   SUB(B,64,B)
  ENDIF

  IF B<>255
   *LPT(B)
  ENDIF

  IF B=62 ;S
   IF SPACING=0
    SPACING=1
    POKE(1581,64)
    POKE(1585,96)
    POKE(1589,64)
    POKE(1593,96)

    POKE(1597,128)
    POKE(1598,34)
    POKE(1601,144)
    POKE(1602,34)
    POKE(1605,128)
    POKE(1606,34)
    POKE(1609,144)
    POKE(1610,34)
    POKE(1613,128)
    POKE(1614,34)


   ELSE
    SPACING=0
    POKE(1581,0)
    POKE(1585,32)
    POKE(1589,0)
    POKE(1593,32)

    POKE(1597,0)
    POKE(1598,35)
    POKE(1601,16)
    POKE(1602,35)
    POKE(1605,0)
    POKE(1606,35)
    POKE(1609,16)
    POKE(1610,35)
    POKE(1613,0)
    POKE(1614,35)

   ENDIF
  ENDIF

  IF MODE=0
   IF B=63 ;A
    IF ASCIIMODE=0
     ASCIIMODE=1
    ELSE
     ASCIIMODE=0
    ENDIF
    .AFILL()
   ENDIF

   IF B=54 ;roll back
    .ROLL(0)
    .DRAWSCRN(0)    
   ENDIF

   IF B=55 ;roll forward
    .ROLL(1)
    .DRAWSCRN(0)
   ENDIF

  ENDIF

  *IF B=0 ;L
  *ENDIF

  *IF B=56 ;F
  *ENDIF

  IF B=58 ;D
   EDITMODE=4
   .DRAWSCRN(0)
  ENDIF

  IF B=57 ;H
   EDITMODE=3
   .DRAWSCRN(0)
  ENDIF

  IF B=33 ;SPACE
   ADD(CURSEC,1,CURSEC)
   .DRAWSCRN(1)
  ENDIF

  IF B=52 ;backspace
   IF CURSEC>1
    SUB(CURSEC,1,CURSEC)
    .DRAWSCRN(1)
   ENDIF
  ENDIF

  *IF B=10 ;PAUSE
  *ENDIF  
 ENDIF

 KEYBD=255 ;clr

ENDPROC

************************************

PROC ROLL
IN
 BYTE
 [
  B
 ]
LOCAL
 BYTE
 [
  I,X,F,L
 ]
 WORD
 [
  SADR,DADR
 ]

BEGIN

 I=0
 IF B=0
  SADR=41094
  DADR=41095
 ELSE
  DADR=40968
  SADR=40969
 ENDIF

 PEEK(40968,F) ;first byte
 PEEK(41095,L) ;last byte

 REPEAT
  PEEK(SADR,X)
  POKE(DADR,X)
  IF B=0
   SUB(SADR,1,SADR)
   SUB(DADR,1,DADR)
  ELSE
   ADD(SADR,1,SADR)
   ADD(DADR,1,DADR)
  ENDIF
  I+
 UNTIL I=128

 IF B=0
  POKE(40968,L)
 ELSE
  POKE(41095,F)
 ENDIF

ENDPROC


************************************

PROC CONSOLE
BEGIN

 IF CONDELAY>10
  CONDELAY=0

  IF CONSOL=3 ;OPTION
   .SCREEN(1) ;editor
   .DRAWSCRN(1)
  ENDIF
  IF CONSOL=5 ;SELECT
   .SCREEN(2) ;selector
  ENDIF
  IF CONSOL=6 ;START
   .SCREEN(0) ;explorer
   .DRAWSCRN(1)
  ENDIF

 ENDIF

 *reset
 CONSOL=8

ENDPROC

************************************

PROC SCREEN
IN
 BYTE
 [
  B
 ]
BEGIN

 MODE=B
 HORZP0=0
 HORZP1=0
 HORZP2=0
 HORZP3=0

 IF MODE=0 ;Explorer
  SETDLI=0
  SDLSTL=1536
  HORZP0=50
  HORZP1=197
  HORZP2=128
  HORZP3=160
  CLR(44,2)
 ENDIF
 
 IF MODE=1 ;Editor
  HORZP0=188
  HORZP1=200
  SETDLI=1
  SDLSTL=1651
  CLR(44,2)
 ENDIF

 IF MODE=2 ;Selector
  SETDLI=2
  SDLSTL=1704
 ENDIF

 IF MODE=3 ;Options
  SETDLI=20
  SDLSTL=1619
 ENDIF

 IF MODE=5 ;Title page
  SETDLI=5
  SDLSTL=1744
 ENDIF

ENDPROC

************************************

PROC DRAWSCRN
IN
 BYTE
 [
  TYPE
 ]
LOCAL
 BYTE
 [
  X,Y,B,HB,LB
 ]
 WORD
 [
  TT
 ]
BEGIN

 IF MODE=0 ;explorer
  IF TYPE=1
   .READDATA(CURSEC)
   FMOVE(7168,40968,128)
  ENDIF
  .PFILL() ;fill players
  .AFILL() ;fill atascii
  .HFILL() ;fill hex
  .DFILL() ;fill decimal
  PEEK(40968,CURRBYTE)
  .CFILL() ;fill current
  *update top line status
  .CSTR3(CURSEC,7959) ;top mid sec#
 ENDIF

 IF MODE=1 ;editor
  CLR(55,4)
  IF TYPE=1 ;read new data
   .READDATA(CURSEC)
   FMOVE(7168,40968,128)
  ENDIF
  .CSTR3(CURSEC,8039) ;sect #
  DD=40968 ;buffer
  MM=14081 ;screen
  IF EDITMODE=3 ;hex
   S="HEX"
   .DISPCHAR(8053,3,96)
   REPEAT
    X=0
    TT=DD ;get current octet
    REPEAT
     PEEK(DD,B) ;get current byte
     .CHEX(B,HB,LB)
     POKE(MM,HB)
     ADD(MM,1,MM)
     POKE(MM,LB)
     ADD(MM,1,MM)
     POKE(MM,0)
     ADD(MM,1,MM)
     ADD(DD,1,DD) ;next byte
     X+
    UNTIL X=8
    ADD(MM,7,MM) ;next row
    .DRAW8ASC(MM,TT)
    ADD(MM,9,MM) ;next row
   UNTIL DD>=41096
  ENDIF

  IF EDITMODE=4 ;dec
   S="DEC"
   .DISPCHAR(8053,3,96)
   SUB(MM,1,MM)
   REPEAT
    X=0
    TT=DD ;get current octet
    REPEAT
     PEEK(DD,B) ;get current byte    
     .CSTR3(B,MM)
     ADD(MM,4,MM)
     ADD(DD,1,DD) ;next byte
     X+
    UNTIL X=8
    .DRAW8ASC(MM,TT)
    ADD(MM,8,MM) ;next row
   UNTIL DD>=41096
  ENDIF

  *editor buttons
  .BUTDRAW(14848,4,"save")
  .BUTDRAW(14854,4,"fill")
  .BUTDRAW(14860,5,"range")
  .BUTDRAW(14875,5,"print")
  *PMG
  .EFILL()
 ENDIF

 IF MODE=20 ;init selector
  CLR(59,4)
  DD=15104 ;draw empty map
  REPEAT
   POKE(DD,159)
   ADD(DD,1,DD)
  UNTIL DD=15824
  *draw buttons
  .BUTDRAW(15944,5,"quick")
  .BUTDRAW(15951,4,"find")
  .BUTDRAW(15957,5,"files")
  .BUTDRAW(15824,7,"explore")
  .BUTDRAW(15833,4,"edit")
  .BUTDRAW(15839,3,"map")
  S="BYTES"
  .DISPCHAR(8126,5,96)
  S="USED"
  .DISPCHAR(16064,4,96)
  S="EMPTY"
  .DISPCHAR(16075,5,96)
 ENDIF

 IF MODE=2 ;selector
  .CSTR3(CURSEC,8119) ;top middle
 ENDIF

 IF MODE=3 ;options
 ENDIF

 IF MODE=5 ;title page
  CLR(29,2)
  S="DISK EXPLORER"
  .DISPCHAR(7427,13,32)
   S="(C)2015 J.WILKINSON"
  .DISPCHAR(7444,19,32)
  S="SSSD DISKS ONLY"
  .DISPCHAR(7536,15,96)
  S="press any key to continue"
  .DISPCHAR(7652,26,0)
 ENDIF

ENDPROC

************************************

PROC DRAW8ASC
IN
 WORD
 [
  SCR,DAT
 ]
LOCAL
 BYTE
 [
  R,D
 ]
BEGIN

 R=0
 REPEAT
  PEEK(DAT,D)
  .EXT2INT(D,D) ;convert
  POKE(SCR,D)
  ADD(DAT,1,DAT)
  ADD(SCR,1,SCR)
  R+
 UNTIL R=8

ENDPROC

************************************

PROC BUTDRAW
IN
 WORD
 [
  MEMLOC
 ]
 BYTE
 [
  LEN
 ]
 ARRAY
 [
  TEXT(12)
 ]
LOCAL
 BYTE
 [
  I
 ]
BEGIN

 *top line
 POKE(MEMLOC,81)
 I=0
 REPEAT
  ADD(MEMLOC,1,MEMLOC)
  POKE(MEMLOC,82)
  I+1
 UNTIL I>LEN
 POKE(MEMLOC,69)

 *text
 SUB(40,I,I)
 ADD(MEMLOC,I,MEMLOC)
 *POKE(MEMLOC,86) ;86
 ADD(MEMLOC,1,MEMLOC)
 S=TEXT
 .DISPCHAR(MEMLOC,LEN,0)
 ADD(MEMLOC,LEN,MEMLOC)
 *POKE(MEMLOC,86) ;66
 ADD(MEMLOC,I,MEMLOC)

 *bottom line
 POKE(MEMLOC,90)
 I=0
 REPEAT
  ADD(MEMLOC,1,MEMLOC)
  POKE(MEMLOC,82)
  I+1
 UNTIL I>LEN
 POKE(MEMLOC,67)
 
ENDPROC

************************************

PROC BUTCHECK
IN
 WORD
 [
  MEMLOC
 ]
 BYTE
 [
  LEN
 ]
OUT
 BYTE
 [
  RET
 ]
LOCAL
 BYTE
 [
  X,Y
  LX,TY,RX,BY
 ]
BEGIN
 RET=0 ;default - no click
 IF MODE=1 ;edit
  MM=14080
 ENDIF
 IF MODE=2 ;select
  MM=15104
 ENDIF

 SUB(MEMLOC,MM,MM) ;get mem position

 *find mouse x,y
 DIV(MY,8,Y)
 DIV(MX,4,X)

 *find lx,ty,rx,by of button
 DIV(MM,40,TY)
 ADD(TY,2,BY) ;always 3 high
 MULT(TY,40,DD)
 SUB(MM,DD,LX)
 ADD(LX,LEN,RX) ;width = len+

 *compare
 IF Y>=TY
  IF Y<=BY
   IF X>=LX
    IF X<=RX 
     RET=1
    ENDIF
   ENDIF
  ENDIF
 ENDIF

ENDPROC

************************************

PROC PFILL
LOCAL
 BYTE
 [
  I,X,Y
 ]
 WORD
 [
  SADR,DADR
 ]

BEGIN

 I=0
 SADR=40968
 DADR=41216

 REPEAT
  PEEK(SADR,X)
  EOR(X,255,Y)
  POKE(DADR,Y)
  ADD(SADR,1,SADR)
  ADD(DADR,1,DADR)
  I+
 UNTIL I=128

 PLAYER(44,96,128,40968) ;pm0
 PLAYER(45,96,128,41216) ;pm1
 
ENDPROC

************************************

PROC AFILL
LOCAL
 BYTE
 [
  I
 ]
BEGIN

 FMOVE(40968,9728,128)

 IF ASCIIMODE=1 THEN
  MM=9728
  REPEAT
   PEEK(MM,I)
   .EXT2INT(I,I)
   POKE(MM,I)
   IF I>65
    IF I<97
     POKE(MM,0)
    ENDIF
   ENDIF
   IF I>122
    POKE(MM,0)
   ENDIF
   ADD(MM,1,MM)
  UNTIL MM=9856
  S="  ASCII"
  .DISPCHAR(7969,5,160)
 ELSE
  MM=9728
  REPEAT
   PEEK(MM,I)
   .EXT2INT(I,I)
   POKE(MM,I)
   ADD(MM,1,MM)
  UNTIL MM=9856
  S="ATASCII"
  .DISPCHAR(7969,7,160)
 ENDIF

ENDPROC

************************************

PROC HFILL
LOCAL
 BYTE
 [
  I,X,Y
  HB,LB
 ]
 WORD
 [
  SADR
 ]
 ARRAY
 [
  HEX(2)
 ]
BEGIN

 I=0
 Y=0
 SADR=40968
 MM=8192
 CLR(32,1)

 REPEAT
  PEEK(SADR,X)
  .CHEX(X,HB,LB)
  POKE(MM,HB)
  ADD(MM,1,MM)
  POKE(MM,LB)
  ADD(MM,1,MM)
  ADD(SADR,1,SADR)
  I+
 UNTIL I=128

ENDPROC

************************************

PROC DFILL
LOCAL
 BYTE
 [
  ID,X
 ]
BEGIN

 ID=0
 CLR(50,2)
 MM=12800
 DD=40968
 REPEAT
  PEEK(DD,X)
  .CSTR3(X,MM)
  ADD(MM,4,MM)
  ADD(DD,1,DD)
  ID+
 UNTIL ID=128

ENDPROC

************************************

PROC EFILL
BEGIN

 PLAYER(44,164,64,40968) ;pm0
 PLAYER(45,164,64,41032) ;pm1

ENDPROC

************************************

PROC CFILL
LOCAL
 BYTE
 [
  HB,LB
  A,I
 ]
BEGIN

 CLR(39,1) 

 *atascii
 S="ATASCII "
 .DISPCHAR(9984,8,160)
 POKE(9992,CURRBYTE)

 *decimal
 S="DEC "
 .DISPCHAR(9995,4,160)
 .CSTR2(CURRBYTE,9999,3,0)
 
 *hexidecimal
 S="HEX "
 .DISPCHAR(10004,4,160)
 .CHEX(CURRBYTE,HB,LB)
 POKE(10008,HB)
 POKE(10009,LB)

 *binary
 S="BIN "
 .DISPCHAR(10012,4,160)
 I=128
 MM=10016
 REPEAT
  AND(CURRBYTE,I,A)
  IF I=A
   POKE(MM,17)
  ELSE
   POKE(MM,16)
  ENDIF
  ADD(MM,1,MM)
  LSRB(I)
 UNTIL I=0

ENDPROC

************************************

PROC CHEX
IN
 BYTE
 [
  BITE
 ]
OUT
 BYTE
 [
  HB,LB
 ]
LOCAL
 BYTE
 [
  HNIB
  LNIB
 ]
BEGIN

 *get high nibble
 HNIB=BITE
 LSRB(HNIB) ;shift right
 LSRB(HNIB)
 LSRB(HNIB)
 LSRB(HNIB)

 *get low nibble
 LNIB=BITE
 ASLB(LNIB) ;shift left
 ASLB(LNIB)
 ASLB(LNIB)
 ASLB(LNIB)
 LSRB(LNIB) ;shift right
 LSRB(LNIB)
 LSRB(LNIB)
 LSRB(LNIB)

 IF LNIB<10
  ADD(LNIB,16,LNIB)
 ELSE
  ADD(LNIB,23,LNIB)
 ENDIF

 IF HNIB<10
  ADD(HNIB,16,HNIB)
 ELSE
  ADD(HNIB,23,HNIB)
 ENDIF

 LB=LNIB
 HB=HNIB

ENDPROC 

************************************
* UTILS
************************************

*+32 =Upper to Lower
*+96 =Upper to Inverse
*+160=Upper to Lower Inverse
*+224=Upper to Upper

PROC DISPCHAR
IN
 WORD
 [
  AA
 ]
 BYTE
 [
  L,A
 ]
LOCAL
 BYTE
 [
  X,T
 ]
BEGIN

 X=0
 REPEAT
  T=S(X) ;current char
  IF T=32
   T=0 ;space
  ELSE
   ADD(T,A,T) ;optional adj
  ENDIF
  POKE(AA,T) ;write
  ADD(AA,1,AA)
  X+
 UNTIL X=L

ENDPROC

************************************

PROC CSTR2
IN
 WORD
 [
  NN,OO
 ]
 BYTE
 [
  L,DDA
 ]
LOCAL
 WORD
 [
  WW,CMP
 ]
 BYTE
 [ 
  I,X,T
 ]
BEGIN

 T=0
 I=0
 L-
 CMP=1
 REPEAT
  IF I<L
   MULT(CMP,10,CMP) ;set cmp value
  ENDIF 
  I+
 UNTIL I=6
 L+

 REPEAT
  IF NN>=CMP
   DIV(NN,CMP,X)
   ADD(X,16,I) ;conv chars
   MULT(X,CMP,WW)
   SUB(NN,WW,NN)
  ELSE
   I=16 ;placeholder for zero
  ENDIF

  ADD(I,DDA,I)
  POKE(OO,I) :write to mem loc
  ADD(OO,1,OO)

  DIV(CMP,10,CMP) ;next exp
  T+
 UNTIL T>=L

ENDPROC

************************************

PROC CSTR3 ;faster version
IN
 WORD
 [
  NN,OO
 ]
LOCAL
 WORD
 [
  WW
 ]
 BYTE
 [ 
  I,X
 ]
BEGIN

 IF NN>=100
  DIV(NN,100,X)
  ADD(X,16,I)
  MULT(X,100,WW)
  SUB(NN,WW,NN)
 ELSE
  I=16 ;placeholder for zero
 ENDIF

 POKE(OO,I) :write to mem loc
 ADD(OO,1,OO)
  
 IF NN>=10
  DIV(NN,10,X)
  ADD(X,16,I)
  MULT(X,10,WW)
  SUB(NN,WW,NN)
 ELSE
  I=16 ;placeholder for zero
 ENDIF

 POKE(OO,I) :write to mem loc
 ADD(OO,1,OO)

 IF NN>=1
  ADD(NN,16,I)
 ELSE
  I=16 ;placeholder for zero
 ENDIF

 POKE(OO,I) :write to mem loc

ENDPROC

************************************

PROC INBOX
IN
 WORD
 [
  MEMLOC
 ]
 BYTE
 [
  LEN,BASE
 ]
OUT
 BYTE
 [
  RET
 ]
LOCAL
 BYTE
 [
  B,K,IN,C
  B1,B2,B3,RL
 ]
 WORD
 [
  WW
 ]
BEGIN

 IN=0 ;num of chars input
 C=0  ;cancel flag
 RL=LEN ;save for unhighlighting

 *save current values for len 2/3
 WW=MEMLOC
 PEEK(WW,B1)
 ADD(WW,1,WW)
 PEEK(WW,B2)
 ADD(WW,1,WW)
 PEEK(WW,B3)

 *highlight edit box
 WW=MEMLOC
 B=0
 REPEAT
  PEEK(WW,K)
  ADD(K,128,K)
  POKE(WW,K)
  ADD(WW,1,WW)
  B+
 UNTIL B=LEN
 WW=MEMLOC
 K=0
 
 REPEAT
  B=KEYBD
  K=0
  IF B<>255
   IF B=50
    K=16 ;0
   ENDIF
   IF B=31
    K=17  ;1
   ENDIF
   IF B=30
    K=18  ;2
   ENDIF
   IF B=26
    K=19  ;3
   ENDIF
   IF B=24
    K=20  ;4
   ENDIF
   IF B=29
    K=21  ;5
   ENDIF
   IF B=27
    K=22  ;6
   ENDIF
   IF B=51
    K=23  ;7
   ENDIF
   IF B=53
    K=24  ;8
   ENDIF
   IF B=48
    K=25  ;9
   ENDIF
   IF BASE=16
    IF B=127
     K=33  ;A
    ENDIF
    IF B=85
     K=34  ;B
    ENDIF
    IF B=82
     K=35  ;C
    ENDIF
    IF B=122
     K=36  ;D
    ENDIF
    IF B=106
     K=37  ;E
    ENDIF
    IF B=120
     K=38  ;F
    ENDIF
   ENDIF

   IF B=52 ;BKSPC
    IF IN>0
     SUB(MEMLOC,1,MEMLOC)
     POKE(MEMLOC,128)
     IN-
    ENDIF
   ENDIF

   IF B=12 ;ENTER
    LEN=IN
   ENDIF

   IF B=28 ;ESC
    LEN=IN
    C=1
   ENDIF

   IF K<>0
    ADD(K,128,K)
    POKE(MEMLOC,K)
    ADD(MEMLOC,1,MEMLOC)
    IN+
   ENDIF

   KEYBD=255 ;clr
  ENDIF

 UNTIL IN=LEN

 IF C=1 ;op cancelled, restore vals
  IF LEN<4
   IF LEN>1
    POKE(WW,B1)
    ADD(WW,1,WW)
    POKE(WW,B2)
    ADD(WW,1,WW)
    POKE(WW,B3)
   ENDIF
  ENDIF
  RET=0 ;stop editing
 ELSE ;good result, unhighlight
  RET=1 ;good edit, continue
 ENDIF

 B=0
 REPEAT
  PEEK(WW,K)
  SUB(K,128,K)
  POKE(WW,K)
  ADD(WW,1,WW)
  B+
 UNTIL B=RL

ENDPROC

************************************

PROC EXT2INT
IN
 BYTE
 [
  EIIN
 ]
OUT
 BYTE
 [
  EIOUT
 ]
BEGIN

 EIOUT=0
 IF EIIN>127
  SUB(EIIN,127,EIIN)
  EIOUT=127
 ENDIF

 IF EIIN>=0
  IF EIIN<32
   ADD(EIIN,32,EIIN) ;64
  ENDIF
 ENDIF

 IF EIIN>31
  IF EIIN<96
   SUB(EIIN,32,EIIN)
  ENDIF
 ENDIF

 ADD(EIIN,EIOUT,EIOUT) ;high bit

ENDPROC

************************************
